﻿//-----------------------------------------------------------------------
// <copyright file="Contact.cs" company="deixei.com">
//     Copyright (c) deixei.com. All rights reserved.
// </copyright>
// <author>Marcio Parente</author>
//---------------------------------------------------------------------
namespace Deixei.Domain
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    /// <summary>
    /// Contact. Represents a contact, this is equal to an Outlook contact.
    /// </summary>
    public class Contact : IDomainEntity, IArchivable, IAuditable
    {
        /// <summary>
        /// Gets or sets the id.
        /// </summary>
        /// <value>
        /// The id.
        /// </value>
        [Key]
        [Display(Name = "Id")]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        /// <summary>
        /// Gets or sets the title.
        /// </summary>
        /// <value>
        /// The title.
        /// </value>
        [Display(Name = "Title")]
        public string Title { get; set; }
        /// <summary>
        /// Gets or sets the first name.
        /// </summary>
        /// <value>
        /// The first name.
        /// </value>
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        /// <summary>
        /// Gets or sets the name of the middle.
        /// </summary>
        /// <value>
        /// The name of the middle.
        /// </value>
        [Display(Name = "Middle Name")]
        public string MiddleName { get; set; }
        /// <summary>
        /// Gets or sets the last name.
        /// </summary>
        /// <value>
        /// The last name.
        /// </value>
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        /// <summary>
        /// Gets or sets the suffix.
        /// </summary>
        /// <value>
        /// The suffix.
        /// </value>
        [Display(Name = "Suffix")]
        public string Suffix { get; set; }
        /// <summary>
        /// Gets or sets the company.
        /// </summary>
        /// <value>
        /// The company.
        /// </value>
        [Display(Name = "Company")]
        public string Company { get; set; }
        /// <summary>
        /// Gets or sets the department.
        /// </summary>
        /// <value>
        /// The department.
        /// </value>
        [Display(Name = "Department")]
        public string Department { get; set; }
        /// <summary>
        /// Gets or sets the job title.
        /// </summary>
        /// <value>
        /// The job title.
        /// </value>
        [Display(Name = "Job Title")]
        public string JobTitle { get; set; }
        /// <summary>
        /// Gets or sets the business street.
        /// </summary>
        /// <value>
        /// The business street.
        /// </value>
        [Display(Name = "Business Street")]
        public string BusinessStreet { get; set; }
        /// <summary>
        /// Gets or sets the business street2.
        /// </summary>
        /// <value>
        /// The business street2.
        /// </value>
        [Display(Name = "Business Street 2")]
        public string BusinessStreet2 { get; set; }
        /// <summary>
        /// Gets or sets the business street3.
        /// </summary>
        /// <value>
        /// The business street3.
        /// </value>
        [Display(Name = "Business Street 3")]
        public string BusinessStreet3 { get; set; }
        /// <summary>
        /// Gets or sets the business city.
        /// </summary>
        /// <value>
        /// The business city.
        /// </value>
        [Display(Name = "Business City")]
        public string BusinessCity { get; set; }
        /// <summary>
        /// Gets or sets the state of the business.
        /// </summary>
        /// <value>
        /// The state of the business.
        /// </value>
        [Display(Name = "Business State")]
        public string BusinessState { get; set; }
        /// <summary>
        /// Gets or sets the business postal code.
        /// </summary>
        /// <value>
        /// The business postal code.
        /// </value>
        [Display(Name = "Business Postal Code")]
        public string BusinessPostalCode { get; set; }
        /// <summary>
        /// Gets or sets the business country region.
        /// </summary>
        /// <value>
        /// The business country region.
        /// </value>
        [Display(Name = "Business Country/Region")]
        public string BusinessCountryRegion { get; set; }
        /// <summary>
        /// Gets or sets the home street.
        /// </summary>
        /// <value>
        /// The home street.
        /// </value>
        [Display(Name = "Home Street")]
        public string HomeStreet { get; set; }
        /// <summary>
        /// Gets or sets the home street2.
        /// </summary>
        /// <value>
        /// The home street2.
        /// </value>
        [Display(Name = "Home Street 2")]
        public string HomeStreet2 { get; set; }
        /// <summary>
        /// Gets or sets the home street3.
        /// </summary>
        /// <value>
        /// The home street3.
        /// </value>
        [Display(Name = "Home Street 3")]
        public string HomeStreet3 { get; set; }
        /// <summary>
        /// Gets or sets the home city.
        /// </summary>
        /// <value>
        /// The home city.
        /// </value>
        [Display(Name = "Home City")]
        public string HomeCity { get; set; }
        /// <summary>
        /// Gets or sets the state of the home.
        /// </summary>
        /// <value>
        /// The state of the home.
        /// </value>
        [Display(Name = "Home State")]
        public string HomeState { get; set; }
        /// <summary>
        /// Gets or sets the home postal code.
        /// </summary>
        /// <value>
        /// The home postal code.
        /// </value>
        [Display(Name = "Home Postal Code")]
        public string HomePostalCode { get; set; }
        /// <summary>
        /// Gets or sets the home country region.
        /// </summary>
        /// <value>
        /// The home country region.
        /// </value>
        [Display(Name = "Home Country/Region")]
        public string HomeCountryRegion { get; set; }
        /// <summary>
        /// Gets or sets the other street.
        /// </summary>
        /// <value>
        /// The other street.
        /// </value>
        [Display(Name = "Other Street")]
        public string OtherStreet { get; set; }
        /// <summary>
        /// Gets or sets the other street2.
        /// </summary>
        /// <value>
        /// The other street2.
        /// </value>
        [Display(Name = "Other Street 2")]
        public string OtherStreet2 { get; set; }
        /// <summary>
        /// Gets or sets the other street3.
        /// </summary>
        /// <value>
        /// The other street3.
        /// </value>
        [Display(Name = "Other Street 3")]
        public string OtherStreet3 { get; set; }
        /// <summary>
        /// Gets or sets the other city.
        /// </summary>
        /// <value>
        /// The other city.
        /// </value>
        [Display(Name = "Other City")]
        public string OtherCity { get; set; }
        /// <summary>
        /// Gets or sets the state of the other.
        /// </summary>
        /// <value>
        /// The state of the other.
        /// </value>
        [Display(Name = "Other State")]
        public string OtherState { get; set; }
        /// <summary>
        /// Gets or sets the other postal code.
        /// </summary>
        /// <value>
        /// The other postal code.
        /// </value>
        [Display(Name = "Other Postal Code")]
        public string OtherPostalCode { get; set; }
        /// <summary>
        /// Gets or sets the other country region.
        /// </summary>
        /// <value>
        /// The other country region.
        /// </value>
        [Display(Name = "Other Country/Region")]
        public string OtherCountryRegion { get; set; }
        /// <summary>
        /// Gets or sets the assistants phone.
        /// </summary>
        /// <value>
        /// The assistants phone.
        /// </value>
        [Display(Name = "Assistant's Phone")]
        public string AssistantsPhone { get; set; }
        /// <summary>
        /// Gets or sets the business fax.
        /// </summary>
        /// <value>
        /// The business fax.
        /// </value>
        [Display(Name = "Business Fax")]
        public string BusinessFax { get; set; }
        /// <summary>
        /// Gets or sets the business phone.
        /// </summary>
        /// <value>
        /// The business phone.
        /// </value>
        [Display(Name = "Business Phone")]
        public string BusinessPhone { get; set; }
        /// <summary>
        /// Gets or sets the business phone2.
        /// </summary>
        /// <value>
        /// The business phone2.
        /// </value>
        [Display(Name = "Business Phone 2")]
        public string BusinessPhone2 { get; set; }
        /// <summary>
        /// Gets or sets the callback.
        /// </summary>
        /// <value>
        /// The callback.
        /// </value>
        [Display(Name = "Callback")]
        public string Callback { get; set; }
        /// <summary>
        /// Gets or sets the car phone.
        /// </summary>
        /// <value>
        /// The car phone.
        /// </value>
        [Display(Name = "Car Phone")]
        public string CarPhone { get; set; }
        /// <summary>
        /// Gets or sets the company main phone.
        /// </summary>
        /// <value>
        /// The company main phone.
        /// </value>
        [Display(Name = "Company Main Phone")]
        public string CompanyMainPhone { get; set; }
        /// <summary>
        /// Gets or sets the home fax.
        /// </summary>
        /// <value>
        /// The home fax.
        /// </value>
        [Display(Name = "Home Fax")]
        public string HomeFax { get; set; }
        /// <summary>
        /// Gets or sets the home phone.
        /// </summary>
        /// <value>
        /// The home phone.
        /// </value>
        [Display(Name = "Home Phone")]
        public string HomePhone { get; set; }
        /// <summary>
        /// Gets or sets the home phone2.
        /// </summary>
        /// <value>
        /// The home phone2.
        /// </value>
        [Display(Name = "Home Phone 2")]
        public string HomePhone2 { get; set; }
        /// <summary>
        /// Gets or sets the ISDN.
        /// </summary>
        /// <value>
        /// The ISDN.
        /// </value>
        [Display(Name = "ISDN")]
        public string ISDN { get; set; }
        /// <summary>
        /// Gets or sets the mobile phone.
        /// </summary>
        /// <value>
        /// The mobile phone.
        /// </value>
        [Display(Name = "Mobile Phone")]
        public string MobilePhone { get; set; }
        /// <summary>
        /// Gets or sets the other fax.
        /// </summary>
        /// <value>
        /// The other fax.
        /// </value>
        [Display(Name = "Other Fax")]
        public string OtherFax { get; set; }
        /// <summary>
        /// Gets or sets the other phone.
        /// </summary>
        /// <value>
        /// The other phone.
        /// </value>
        [Display(Name = "Other Phone")]
        public string OtherPhone { get; set; }
        /// <summary>
        /// Gets or sets the pager.
        /// </summary>
        /// <value>
        /// The pager.
        /// </value>
        [Display(Name = "Pager")]
        public string Pager { get; set; }
        /// <summary>
        /// Gets or sets the primary phone.
        /// </summary>
        /// <value>
        /// The primary phone.
        /// </value>
        [Display(Name = "Primary Phone")]
        public string PrimaryPhone { get; set; }
        /// <summary>
        /// Gets or sets the radio phone.
        /// </summary>
        /// <value>
        /// The radio phone.
        /// </value>
        [Display(Name = "Radio Phone")]
        public string RadioPhone { get; set; }

        /// <summary>
        /// Gets or sets the TTYTDD phone.
        /// </summary>
        /// <value>
        /// The TTYTDD phone.
        /// </value>
        [Display(Name = "TTY/TDD Phone")]
        public string TTYTDDPhone { get; set; }

        /// <summary>
        /// Gets or sets the telex.
        /// </summary>
        /// <value>
        /// The telex.
        /// </value>
        [Display(Name = "Telex")]
        public string Telex { get; set; }
        /// <summary>
        /// Gets or sets the account.
        /// </summary>
        /// <value>
        /// The account.
        /// </value>
        [Display(Name = "Account")]
        public string Account { get; set; }
        /// <summary>
        /// Gets or sets the anniversary.
        /// </summary>
        /// <value>
        /// The anniversary.
        /// </value>
        [Display(Name = "Anniversary")]
        public string Anniversary { get; set; }
        /// <summary>
        /// Gets or sets the name of the assistants.
        /// </summary>
        /// <value>
        /// The name of the assistants.
        /// </value>
        [Display(Name = "Assistant's Name")]
        public string AssistantsName { get; set; }
        /// <summary>
        /// Gets or sets the billing information.
        /// </summary>
        /// <value>
        /// The billing information.
        /// </value>
        [Display(Name = "Billing Information")]
        public string BillingInformation { get; set; }
        /// <summary>
        /// Gets or sets the birthday.
        /// </summary>
        /// <value>
        /// The birthday.
        /// </value>
        [Display(Name = "Birthday")]
        public string Birthday { get; set; }
        /// <summary>
        /// Gets or sets the business address PO box.
        /// </summary>
        /// <value>
        /// The business address PO box.
        /// </value>
        [Display(Name = "Business Address PO Box")]
        public string BusinessAddressPOBox { get; set; }
        /// <summary>
        /// Gets or sets the categories.
        /// </summary>
        /// <value>
        /// The categories.
        /// </value>
        [Display(Name = "Categories")]
        public string Categories { get; set; }
        /// <summary>
        /// Gets or sets the children.
        /// </summary>
        /// <value>
        /// The children.
        /// </value>
        [Display(Name = "Children")]
        public string Children { get; set; }
        /// <summary>
        /// Gets or sets the directory server.
        /// </summary>
        /// <value>
        /// The directory server.
        /// </value>
        [Display(Name = "Directory Server")]
        public string DirectoryServer { get; set; }

        /// <summary>
        /// Gets or sets the email address.
        /// </summary>
        /// <value>
        /// The email address.
        /// </value>
        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail Address")]
        public string EmailAddress { get; set; }
        /// <summary>
        /// Gets or sets the type of the email.
        /// </summary>
        /// <value>
        /// The type of the email.
        /// </value>
        [Display(Name = "E-mail Type")]
        public string EmailType { get; set; }
        /// <summary>
        /// Gets or sets the display name of the email.
        /// </summary>
        /// <value>
        /// The display name of the email.
        /// </value>
        [Display(Name = "E-mail Display Name")]
        public string EmailDisplayName { get; set; }

        /// <summary>
        /// Gets or sets the email2 address.
        /// </summary>
        /// <value>
        /// The email2 address.
        /// </value>
        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail 2 Address")]
        public string Email2Address { get; set; }
        /// <summary>
        /// Gets or sets the type of the email2.
        /// </summary>
        /// <value>
        /// The type of the email2.
        /// </value>
        [Display(Name = "E-mail 2 Type")]
        public string Email2Type { get; set; }
        /// <summary>
        /// Gets or sets the display name of the email2.
        /// </summary>
        /// <value>
        /// The display name of the email2.
        /// </value>
        [Display(Name = "E-mail 2 Display Name")]
        public string Email2DisplayName { get; set; }

        /// <summary>
        /// Gets or sets the email3 address.
        /// </summary>
        /// <value>
        /// The email3 address.
        /// </value>
        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail 3 Address")]
        public string Email3Address { get; set; }
        /// <summary>
        /// Gets or sets the type of the email3.
        /// </summary>
        /// <value>
        /// The type of the email3.
        /// </value>
        [Display(Name = "E-mail 3 Type")]
        public string Email3Type { get; set; }
        /// <summary>
        /// Gets or sets the display name of the email3.
        /// </summary>
        /// <value>
        /// The display name of the email3.
        /// </value>
        [Display(Name = "E-mail 3 Display Name")]
        public string Email3DisplayName { get; set; }
        /// <summary>
        /// Gets or sets the gender.
        /// </summary>
        /// <value>
        /// The gender.
        /// </value>
        [Display(Name = "Gender")]
        public string Gender { get; set; }
        /// <summary>
        /// Gets or sets the government ID number.
        /// </summary>
        /// <value>
        /// The government ID number.
        /// </value>
        [Display(Name = "Government ID Number")]
        public string GovernmentIDNumber { get; set; }
        /// <summary>
        /// Gets or sets the hobby.
        /// </summary>
        /// <value>
        /// The hobby.
        /// </value>
        [Display(Name = "Hobby")]
        public string Hobby { get; set; }
        /// <summary>
        /// Gets or sets the home address PO box.
        /// </summary>
        /// <value>
        /// The home address PO box.
        /// </value>
        [Display(Name = "Home Address PO Box")]
        public string HomeAddressPOBox { get; set; }
        /// <summary>
        /// Gets or sets the initials.
        /// </summary>
        /// <value>
        /// The initials.
        /// </value>
        [Display(Name = "Initials")]
        public string Initials { get; set; }
        /// <summary>
        /// Gets or sets the internet free busy.
        /// </summary>
        /// <value>
        /// The internet free busy.
        /// </value>
        [Display(Name = "Internet Free Busy")]
        public string InternetFreeBusy { get; set; }
        /// <summary>
        /// Gets or sets the keywords.
        /// </summary>
        /// <value>
        /// The keywords.
        /// </value>
        [Display(Name = "Keywords")]
        public string Keywords { get; set; }
        /// <summary>
        /// Gets or sets the language.
        /// </summary>
        /// <value>
        /// The language.
        /// </value>
        [Display(Name = "Language")]
        public string Language { get; set; }
        /// <summary>
        /// Gets or sets the location.
        /// </summary>
        /// <value>
        /// The location.
        /// </value>
        [Display(Name = "Location")]
        public string Location { get; set; }
        /// <summary>
        /// Gets or sets the name of the managers.
        /// </summary>
        /// <value>
        /// The name of the managers.
        /// </value>
        [Display(Name = "Manager's Name")]
        public string ManagersName { get; set; }
        /// <summary>
        /// Gets or sets the mileage.
        /// </summary>
        /// <value>
        /// The mileage.
        /// </value>
        [Display(Name = "Mileage")]
        public string Mileage { get; set; }
        /// <summary>
        /// Gets or sets the notes.
        /// </summary>
        /// <value>
        /// The notes.
        /// </value>
        [Display(Name = "Notes")]
        public string Notes { get; set; }
        /// <summary>
        /// Gets or sets the office location.
        /// </summary>
        /// <value>
        /// The office location.
        /// </value>
        [Display(Name = "Office Location")]
        public string OfficeLocation { get; set; }
        /// <summary>
        /// Gets or sets the organizational ID number.
        /// </summary>
        /// <value>
        /// The organizational ID number.
        /// </value>
        [Display(Name = "Organizational ID Number")]
        public string OrganizationalIDNumber { get; set; }
        /// <summary>
        /// Gets or sets the other address PO box.
        /// </summary>
        /// <value>
        /// The other address PO box.
        /// </value>
        [Display(Name = "Other Address PO Box")]
        public string OtherAddressPOBox { get; set; }
        /// <summary>
        /// Gets or sets the priority.
        /// </summary>
        /// <value>
        /// The priority.
        /// </value>
        [Display(Name = "Priority")]
        public string Priority { get; set; }
        /// <summary>
        /// Gets or sets the private.
        /// </summary>
        /// <value>
        /// The private.
        /// </value>
        [Display(Name = "Private")]
        public string Private { get; set; }
        /// <summary>
        /// Gets or sets the profession.
        /// </summary>
        /// <value>
        /// The profession.
        /// </value>
        [Display(Name = "Profession")]
        public string Profession { get; set; }
        /// <summary>
        /// Gets or sets the referred by.
        /// </summary>
        /// <value>
        /// The referred by.
        /// </value>
        [Display(Name = "Referred By")]
        public string ReferredBy { get; set; }
        /// <summary>
        /// Gets or sets the sensitivity.
        /// </summary>
        /// <value>
        /// The sensitivity.
        /// </value>
        [Display(Name = "Sensitivity")]
        public string Sensitivity { get; set; }
        /// <summary>
        /// Gets or sets the spouse.
        /// </summary>
        /// <value>
        /// The spouse.
        /// </value>
        [Display(Name = "Spouse")]
        public string Spouse { get; set; }
        /// <summary>
        /// Gets or sets the user1.
        /// </summary>
        /// <value>
        /// The user1.
        /// </value>
        [Display(Name = "User 1")]
        public string User1 { get; set; }
        /// <summary>
        /// Gets or sets the user2.
        /// </summary>
        /// <value>
        /// The user2.
        /// </value>
        [Display(Name = "User 2")]
        public string User2 { get; set; }
        /// <summary>
        /// Gets or sets the user3.
        /// </summary>
        /// <value>
        /// The user3.
        /// </value>
        [Display(Name = "User 3")]
        public string User3 { get; set; }
        /// <summary>
        /// Gets or sets the user4.
        /// </summary>
        /// <value>
        /// The user4.
        /// </value>
        [Display(Name = "User 4")]
        public string User4 { get; set; }

        /// <summary>
        /// Gets or sets the web page.
        /// </summary>
        /// <value>
        /// The web page.
        /// </value>
        [DataType(DataType.Url)]
        [Display(Name = "Web Page")]
        public string WebPage { get; set; }


        /// <summary>
        /// Archivable Region
        /// </summary>
        /// <value>
        /// Deleted by Username.
        /// </value>
        [Display(Name = "Deleted By", Description = "Username of the user that deleted this item.", ShortName = "Del.By")]
        public string DeletedBy { get; set; }

        /// <summary>
        /// Gets or sets the deleted.
        /// </summary>
        /// <value>
        /// Deleted date.
        /// </value>
        [Display(Name = "Deleted Date", Description = "Date of when this item was deleted.", ShortName = "Del.Dt")]
        public DateTime? Deleted { get; set; }

        /// <summary>
        /// Auditable Region
        /// </summary>
        /// <value>
        /// The created by username.
        /// </value>
        [Display(Name = "Created By", Description = "Username of the user that firts registered this item.", ShortName = "Crt.By")]
        public string CreatedBy { get; set; }

        /// <summary>
        /// Gets or sets the created.
        /// </summary>
        /// <value>
        /// created date.
        /// </value>
        [Display(Name = "Created Date", Description = "Date of when this item was firts registered.", ShortName = "Crt.Dt")]
        public DateTime Created { get; set; }

        /// <summary>
        /// Gets or sets the updated by.
        /// </summary>
        /// <value>
        /// The updated by username.
        /// </value>
        [Display(Name = "Updated By", Description = "Username of the user that last changed this item.", ShortName = "Upd.By")]
        public string UpdatedBy { get; set; }

        /// <summary>
        /// Gets or sets the updated.
        /// </summary>
        /// <value>
        /// The updated date.
        /// </value>
        [Display(Name = "Updated Date", Description = "Date of when this item was last changed.", ShortName = "Upd.Dt")]
        public DateTime? Updated { get; set; }


        ////"Title","First Name","Middle Name","Last Name","Suffix","Company","Department","Job Title","Business Street","Business Street 2","Business Street 3","Business City","Business State","Business Postal Code","Business Country/Region","Home Street","Home Street 2","Home Street 3","Home City","Home State","Home Postal Code","Home Country/Region","Other Street","Other Street 2","Other Street 3","Other City","Other State","Other Postal Code","Other Country/Region","Assistant's Phone","Business Fax","Business Phone","Business Phone 2","Callback","Car Phone","Company Main Phone","Home Fax","Home Phone","Home Phone 2","ISDN","Mobile Phone","Other Fax","Other Phone","Pager","Primary Phone","Radio Phone","TTY/TDD Phone","Telex","Account","Anniversary","Assistant's Name","Billing Information","Birthday","Business Address PO Box","Categories","Children","Directory Server","E-mail Address","E-mail Type","E-mail Display Name","E-mail 2 Address","E-mail 2 Type","E-mail 2 Display Name","E-mail 3 Address","E-mail 3 Type","E-mail 3 Display Name","Gender","Government ID Number","Hobby","Home Address PO Box","Initials","Internet Free Busy","Keywords","Language","Location","Manager's Name","Mileage","Notes","Office Location","Organizational ID Number","Other Address PO Box","Priority","Private","Profession","Referred By","Sensitivity","Spouse","User 1","User 2","User 3","User 4","Web Page"
    }
}
